package com.defysoft.waukids.notice;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import org.json.JSONObject;

import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Message;
import android.provider.MediaStore;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

import com.defysoft.waukids.BaseActivity;
import com.defysoft.waukids.Data_Type.BC_NOTICE;
import com.defysoft.waukids.JsonParser;
import com.defysoft.waukids.PublicConstant;
import com.defysoft.waukids.R;
import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;

public class Notice_Detail_Edit_A extends BaseActivity implements OnClickListener {

	String name, sub, photo, rename, resub, rephoto, PK_Not_Code, mode;
	TextView textView;
	
	EditText et[] = new EditText[2];
	ImageView imageView;
	SharedPreferences member;
	
	Toolbar toolbar;
	Spinner spinner;
	String[] celebrities = {"등록"};
	
	final int NOTICE_DETAIL_EDIT = 10;			//수정하기
	final int NOTICE_DETAIL_EDIT_SUCCESS = 9;	//글수정 성공
	final int NOTICE_DETAIL_EDIT_FAIL = 8;		//글수정 실패
	final int MAIN_THREAD = 7;		//처음불러오기
	private final int NONE_NOTICE = 6;		//내용못불러옴.
	private final int SUCCESS_SEARCH= 5;	//내용불러옴.
	private final int FAIL_PHOTOUPDATE= 4;	//사진올리기 실패.
	
	//이미지업로드
	DisplayImageOptions options; 
	ImageLoader imageLoader;
	
	BC_NOTICE bcNotice;
	
	private static final String TEMP_PHOTO_FILE = "temp.jpg"; // 임시 저장파일
	String filePath;
	Bitmap bitmap;
	
	
	/** 사진올리기 되돌아오는... */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (requestCode == 545) {	//사진 새로올리기
			if (resultCode == android.app.Activity.RESULT_OK) {
/*				if (data != null) {*/
					bitmap = BitmapFactory.decodeFile(filePath);
					imageView.setBackgroundColor(0x00ffffff);
					imageView.setImageBitmap(null);
					imageView.setImageBitmap(bitmap);//사진보이게.
				/*}*/
			}
		}
	}
	
	@Override
	protected void onCreate(Bundle arg0) {
		super.onCreate(arg0);
		PK_Not_Code = getIntent().getStringExtra("PK_Not_Code");	//수정이면 값이 있음.
		member = getSharedPreferences("member", MODE_PRIVATE);
		//insert, update
		mode="";
		mode = getIntent().getStringExtra("mode");
		setContentView(R.layout.notice_detail_edit_a);
		setStartData();
		setStartToolbar();
		if (mode.equals("update")) {		//수정일때만 스레드 돌림.
			startDIal();
			imageView.setBackgroundColor(0x00ffffff);
			startNetwork(MAIN_THREAD);
		}
	}
	
	@Override
	public void setStartData() {
		super.setStartData();
		et[0] = (EditText)findViewById(R.id.NOTICE_DETAIL_EDIT_NAME);	//제목
		et[1] = (EditText)findViewById(R.id.NOTICE_DETAIL_EDIT_SUB);	//내용

		
		imageView = (ImageView)findViewById(R.id.NOTICE_DETAIL_EDIT_IMG);	//사진
		textView = (TextView)findViewById(R.id.NOTICE_DETAIL_EDIT_BUTTON);	//공지쓰기 버튼.
		textView.setOnClickListener(this);
		imageView.setOnClickListener(this);
		imageView.setTag(0);	//사진유무 검사를 위한 태그. 0은 사진 없음.
		toolbar = (Toolbar)findViewById(R.id.NOTICE_DETAIL_EDIT_TOOL);
		spinner = (Spinner)findViewById(R.id.NOTICE_EDIT_SPI);
		//이미지 세팅.
		ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
				this).threadPriority(Thread.NORM_PRIORITY - 2)
				.denyCacheImageMultipleSizesInMemory()
				.discCacheFileNameGenerator(new Md5FileNameGenerator())
				.tasksProcessingOrder(QueueProcessingType.LIFO)
				.writeDebugLogs() // Remove for release app
				.build();
		// Initialize ImageLoader with configuration.
		ImageLoader.getInstance().init(config);
		imageLoader = ImageLoader.getInstance();
		imageLoader.clearDiskCache();
		imageLoader.clearMemoryCache();

		options = new DisplayImageOptions.Builder().cacheInMemory(true)
				.showImageOnFail(R.drawable.photo_off)
				.imageScaleType(ImageScaleType.EXACTLY).cacheOnDisc(true)
				.considerExifParams(true).build();
	
		if ((mode.equals("insert"))) {
			imageView.setVisibility(View.VISIBLE);

		}
	}
	
	
	@Override
	public void startThread(int choice) {
		super.startThread(choice);
		final int cho = choice;
		if(firstThread != null){firstThread.interrupt();}
		firstThread = new Thread(new Runnable() {
			@Override
			public void run() {
				switch (cho) {
				case MAIN_THREAD:			//처음 스레드
					mainThread();
					break;
				case NOTICE_DETAIL_EDIT:	//등록클릭.
						startDIal();
						updateNotice();
					break;
				}
			}
		});
		firstThread.start();
	}

	protected void mainThread() {	//처음 불러오는 스레드
		try{
			JSONObject jsonObject = new JSONObject(publicHttpCallback(HTTP_NOTICE_DETAIL, "notice_code="+PK_Not_Code+""));
			if (jsonObject.getBoolean("success")) {	
				bcNotice = JsonParser.NoticeDetail(jsonObject.getString("payload"));
				onNetworkCallback(SUCCESS_SEARCH,"" );
			} else {
				onNetworkCallback(NONE_NOTICE, "");
			}
		}catch(Exception e){
			onNetworkCallback(CATCH_EXCEPTION, "main"+e.toString());		
		}
	}
	
	protected void updateNotice() {	//입력,수정 스레드
		JSONObject jsonObject = null;
		try {
//사진올리기.
			boolean setresult = true;
			String boundary = "^***waukids***^";
			// 데이터 경계선
			String delimiter = "\r\n--" + boundary + "\r\n";			
			
			if (bitmap!=null) {
				StringBuffer postDataBuilder = new StringBuffer();
				// 추가하고 싶은 Key & Value 추가
				// key & value를 추가한 후 꼭 경계선을 삽입해줘야 데이터를 구분할 수 있다.
				// 파일 첨부
				if (!mode.equals("insert")) {
					//기존사진
					postDataBuilder.append(delimiter);
					postDataBuilder.append(setValue("oldphoto", bcNotice.Not_Photo));
				}
				postDataBuilder.append(delimiter);
				postDataBuilder.append(setFile("photo", "temp.jpg"));
				postDataBuilder.append("\r\n");
				// 커넥션 생성 및 설정
				HttpURLConnection conn = (HttpURLConnection) new URL(
						HTTP_NOTICE_DETAIL_UPDATEPHOTO).openConnection();
				conn.setDoInput(true);
				conn.setDoOutput(true);
				conn.setUseCaches(false);
				conn.setRequestMethod("POST");
				conn.setRequestProperty("Connection", "Keep-Alive");
				conn.setRequestProperty("Content-Type",
						"multipart/form-data;boundary=" + boundary);
				// 전송 작업 시작
				DataOutputStream out = new DataOutputStream(
						new BufferedOutputStream(conn
								.getOutputStream()));

				// 위에서 작성한 메타데이터를 먼저 전송한다. (한글이 포함되어 있으므로 UTF-8 메소드
				// 사용)
				out.writeUTF(postDataBuilder.toString());

				// 파일 복사 작업 시작

				byte[] buffer = getbitmap();

				// 버퍼 크기만큼 파일로부터 바이트 데이터를 읽는다.
				// 전송
				out.write(buffer);
				out.writeBytes(delimiter); // 반드시 작성해야 한다.
				out.flush();
				out.close();
				//전송끝, 피드백
				BufferedReader br = new BufferedReader(
						new InputStreamReader(conn.getInputStream()));
				String checkmsg;
				String msg = br.readLine();
				while ((checkmsg = br.readLine()) != null) {
					msg+=checkmsg;
				}
				jsonObject = new JSONObject(msg);
				if (jsonObject.getString("success").equals("true")) {
					photo = jsonObject.getString("payload");
				} else {
					setresult = false;
					onNetworkCallback(FAIL_PHOTOUPDATE, jsonObject.getString("message"));
				}
			}
//내용올리기	
				//insert,update
			if (setresult) {	//사진업로드 성공시에만. 
			if (mode.equals("insert")) {
				jsonObject = new JSONObject(publicHttpCallback(HTTP_NOTICE_DETAIL_EDIT,
						"rename="+rename
						+"&resub="+resub
						+"&rephoto="+photo
						+"&FK_Sch_Not_Code="+member.getString("FK_Sch_Mem_Code", "0")
						+"&FK_Cla_Not_Code="+member.getString("FK_Cla_Mem_Code", "0")
						+"&PK_Mem_Not_Email="+member.getString("PK_Mem_Email", "")
						+"&Not_WriteName="+member.getString("Mem_Name", "")));
			} else {
				if (photo == null) {	//사진교체 유무.
					jsonObject = new JSONObject(publicHttpCallback(HTTP_NOTICE_DETAIL_EDIT,
							"PK_Not_Code="+PK_Not_Code+"&rename="+rename+"&resub="+resub+"&rephoto="+rephoto+"&FK_Sch_Not_Code="+member.getString("FK_Sch_Mem_Code", "0")
							+"&FK_Cla_Not_Code="+member.getString("FK_Cla_Mem_Code", "0")));
				} else{

					jsonObject = new JSONObject(publicHttpCallback(HTTP_NOTICE_DETAIL_EDIT,
							"PK_Not_Code="+PK_Not_Code+"&rename="+rename+"&resub="+resub+"&rephoto="+photo+"&FK_Sch_Not_Code="+member.getString("FK_Sch_Mem_Code", "0")
							+"&FK_Cla_Not_Code="+member.getString("FK_Cla_Mem_Code", "0")));
				}
			}
			}
				if (jsonObject.getBoolean("success")) {
					onNetworkCallback(NOTICE_DETAIL_EDIT_SUCCESS, "");
				} else {
					onNetworkCallback(NOTICE_DETAIL_EDIT_FAIL, jsonObject.getString("message"));
				}
		} catch (Exception e) {
			onNetworkCallback(CATCH_EXCEPTION, e.toString());
		}
	}

	@Override
	protected void handlingMessage(Message _message) {
		super.handlingMessage(_message);
		switch (_message.what) {
		case CATCH_EXCEPTION:
			endDIal();
			if (firstThread != null) {firstThread.interrupt();}
			Toast.makeText(this, (String) _message.obj, Toast.LENGTH_LONG).show();
			break;
		case NOTICE_DETAIL_EDIT_SUCCESS:	//수정성공
			endDIal();
			if (firstThread != null) {firstThread.interrupt();}
			Intent i = new Intent();
			if (mode.equals("insert")) {
				if (member.getString("Mem_Rank", "").equals("2")) {	//선생
					setResult(TOOLBAR_BACK, i.putExtra("Mem_Rank", "2"));				
				} else if (member.getString("Mem_Rank", "").equals("1")) {	//원장.
					setResult(TOOLBAR_BACK, i.putExtra("Mem_Rank", "1"));
				}
			} else {
				if (member.getString("Mem_Rank", "").equals("2")) {	//선생
					setResult(NOTICE_EDIT, i.putExtra("Mem_Rank", "2"));				
				} else if (member.getString("Mem_Rank", "").equals("1")) {	//원장.
					setResult(NOTICE_EDIT, i.putExtra("Mem_Rank", "1"));
				}
			}
			Toast.makeText(this,"완료하였습니다.", Toast.LENGTH_SHORT).show();
			finish();
			break;
		case NOTICE_DETAIL_EDIT_FAIL:	//수정실패.
			if (firstThread != null) {firstThread.interrupt();}
			endDIal();
			Toast.makeText(this,"다시 시도해 주세요.", Toast.LENGTH_LONG).show();
			finish();
			break;
		case SUCCESS_SEARCH:			//내용불러오기 성공.
			if (firstThread != null) {firstThread.interrupt();}
			endDIal();
			et[0].setText(bcNotice.Not_Name);
			et[1].setText(bcNotice.Not_Sub);
			et[0].setSelection(et[0].getText().length(), et[0].getText().length());
			et[1].setSelection(et[1].getText().length(), et[1].getText().length());
			imageLoader.displayImage(PublicConstant.FTP_NOTICE_PHOTO+bcNotice.Not_Photo, imageView, options, null);
			imageView.setTag(1);
			break;
		case NONE_NOTICE:				//내용불러오기 실패.
			if (firstThread != null) {firstThread.interrupt();}
			endDIal();
			Toast.makeText(this,"다시 시도해 주세요.", Toast.LENGTH_LONG).show();
			break;
		case FAIL_PHOTOUPDATE:				//사진업로드 실패.
			if (firstThread != null) {firstThread.interrupt();}
			endDIal();
			Toast.makeText(this,"사진등록 실패", Toast.LENGTH_SHORT).show();
			break;
		}
	}
	private void setStartToolbar() {
		spinner.setAdapter(new ArrayAdapter<String>(this, 0) {
			@Override
			public int getCount() {
				return celebrities.length;
			}

			@Override
			public View getDropDownView(int position, View convertView,
					ViewGroup parent) {
				final int pos = position;
				if (convertView == null) {
					convertView = getLayoutInflater().inflate(
							R.layout.overflowitem_row, null);
				}
				((TextView) convertView.findViewById(R.id.OVERFLOWITEM_TV))
						.setText(celebrities[position]);
				convertView.setOnClickListener(new OnClickListener() {
					@Override
					public void onClick(View v) {
						switch (pos) {
						case 0:
							if (mode.equals("update")) {
								rephoto = bcNotice.Not_Photo;	//기존 사진 이름.
							}
							rename = et[0].getText().toString();
							resub = et[1].getText().toString();
							startNetwork(NOTICE_DETAIL_EDIT);		//수정내용 올리기.
							break;
						}
					}
				});
				return convertView;
			}

			@Override
			public View getView(int position, View convertView, ViewGroup parent) {
				final int pos = position;
				if (convertView == null) {
					convertView = getLayoutInflater().inflate(
							R.layout.overflowitem_row, null);
				}
				((TextView) convertView.findViewById(R.id.OVERFLOWITEM_TV))
						.setBackgroundColor(0x00ffffff);
				return convertView;
			}
		});

		toolbar.setNavigationOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});
	}
	
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.NOTICE_DETAIL_EDIT_IMG:	//사진공간 눌림.
				photoadd();
			break;
			
		case R.id.NOTICE_DETAIL_EDIT_BUTTON:	//공지쓰 눌림.
			rename = et[0].getText().toString();
			resub = et[1].getText().toString();
			int check = 0;
			if (rename.equals("")) {
				Toast.makeText(this, "제목을 입력하세요.", Toast.LENGTH_SHORT).show();
				et[0].setHint("제목 입력은 필수입니다.");
				et[0].setHintTextColor(Color.RED);
				check = 1;
			} else if(bitmap == null && resub.equals("")){
				Toast.makeText(this, "사진 또는 내용 한가지는 입력 하셔야 합니다.", Toast.LENGTH_SHORT).show();
				check = 1;
			} else if(check == 0){
				if (mode.equals("update")) {
					rephoto = bcNotice.Not_Photo;	//기존 사진 이름.
				}
				startNetwork(NOTICE_DETAIL_EDIT);		//수정내용 올리기.
			}
			break;
			
		}
	}

	/** image upload 세팅*/
	private void photoadd() {	//사진공간 눌리면.
		if (isSDCARDMOUNTED()) {
			Intent i = new Intent(Intent.ACTION_PICK,
					android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
			i.setType("image/*");
			i.putExtra("crop", "true");//사진잘라서 가져오기.
			i.putExtra(MediaStore.EXTRA_OUTPUT, getTempUri());	//임시파일 생성.
			i.putExtra("outputFormat", // 포맷방식
					Bitmap.CompressFormat.JPEG.toString());	//jpeg는 손실형 압축, png는 비손실 압축.
/*			i.putExtra("aspectX", 1); // crop의 비율
			i.putExtra("aspectY", 1); // crop의 비율		
			i.putExtra("outputX", 1280); //crop의 최대해상도
			i.putExtra("outputY", 1280); //crop의 최대해상도	*/
			this.startActivityForResult(i, 545);	//사진담아서 다시 스레드 돌림(DB저장, 파일업로드)
		} else {
			Toast.makeText(this, "SD카드가 발견되지 않습니다.\nSD카드가 없으면 사진을 찾을 수 없습니다.", Toast.LENGTH_SHORT).show();
		}
	}

	// ///////////////////////////////////////////////////사진관련 처리
	/** 임시 저장 파일의 경로를 반환 */
	private Uri getTempUri() {
		return Uri.fromFile(getTempFile());
	}
	
	/** 외장메모리에 임시 이미지 파일을 생성하여 그 파일의 경로를 반환 */
	public File getTempFile() {
		if (isSDCARDMOUNTED()) {
			File f = new File(Environment.getExternalStorageDirectory(), // 외장메모리
					TEMP_PHOTO_FILE);		//임시 파일명
			filePath = f.getPath();			//경로.
			try {
				f.delete();
				f.createNewFile(); // 외장메모리에 temp.jpg 파일 생성
			} catch (IOException e) {
			}

			return f;	
		} else {

			// 내장메모리 접근하려했으나 저장까지는 되는데 불러오질못함(bitmapfactory 쪽인 안되는듯함) ㅎㅎㅎ
			return null;
		}
	}
	
	/** SD카드가 마운트 되어 있는지 확인 */
	public boolean isSDCARDMOUNTED() {
		String status = Environment.getExternalStorageState();
		if (status.equals(Environment.MEDIA_MOUNTED))
			return true;
		return false;
	}
	

	// 비트맵 사이즈 줄여서 바이트 배열로 받기
	public byte[] getbitmap() {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		try {

		/*	int height = bitmap.getHeight();
			int width = bitmap.getWidth();
			
			int bw = 620;
			if (bitmap.getWidth() < bw) {
				bw = bitmap.getWidth() - 10;
			}
			// 160 부분을 자신이 원하는 크기로 변경할 수 있습니다.
			bitmap = Bitmap.createScaledBitmap(bitmap, bw, height
					/ (width / bw), true);
*/
			bitmap.compress(CompressFormat.JPEG, 70, baos);
		} catch (Exception e) {
			
		}

		return baos.toByteArray();
	}
	
	/**
	 * Map 형식으로 Key와 Value를 셋팅한다.
	 * 
	 * @param key
	 *            : 서버에서 사용할 변수명
	 * @param value
	 *            : 변수명에 해당하는 실제 값
	 * @return
	 */
	public static String setValue(String key, String value) {
		return "Content-Disposition: form-data; name=\"" + key + "\r\n\r\n"
				+ value;
	}

	/**
	 * 업로드할 파일에 대한 메타 데이터를 설정한다.
	 * 
	 * @param key
	 *            : 서버에서 사용할 파일 변수명
	 * @param fileName
	 *            : 서버에서 저장될 파일명
	 * @return
	 */
	public static String setFile(String key, String fileName) {
		return "Content-Disposition: form-data; name=\"" + key
				+ "\";filename=\"" + fileName + "\"\r\n";
	}

	
}
